home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / pmdev / c / include / libraries / pm.h
C/C++ Source or Header  |  2000-02-28  |  12KB  |  278 lines

  1. /*
  2. //    $VER: pm.h 9.00 (20.4.99)
  3. //
  4. //    Library base, tags and macro definitions
  5. //    for popupmenu.library.
  6. //
  7. //    ©1996-1998 Henrik Isaksson
  8. //    All Rights Reserved.
  9. //
  10. //    Changes:
  11. //
  12. //    9.00    New PopupMenu structure.
  13. //        Several new tags and updated macros.
  14. //    9.01    Added PM_HintBox
  15. //
  16. */
  17.  
  18. #ifndef LIBRARIES_POPUPMENU_H
  19. #define LIBRARIES_POPUPMENU_H
  20.  
  21. #ifndef EXEC_TYPES_H
  22. #include <exec/types.h>
  23. #endif
  24.  
  25. #ifndef EXEC_LIBRARIES_H
  26. #include <exec/libraries.h>
  27. #endif
  28.  
  29. #ifndef UTILITY_TAGITEM_H
  30. #include <utility/tagitem.h>
  31. #endif
  32.  
  33. #ifndef INTUITION_CLASSUSR_H
  34. #include <intuition/classusr.h>
  35. #endif
  36.  
  37. /*
  38. // Tags passed to PM_OpenPopupMenuA and PM_FilterIMsgA
  39. */
  40.  
  41. #define PM_Menu            (TAG_USER+4)    /* (struct PopupMenu *) Pointer to menulist initialized by MakeMenu()        */
  42. #define PM_Top            (TAG_USER+12)    /* (LONG) Top (Y) position                            */
  43. #define PM_Left            (TAG_USER+13)    /* (LONG) Left (X) position                            */
  44. #define PM_Code            (TAG_USER+14)    /* (UWORD) Obsolete.                                */
  45. #define PM_Right        (TAG_USER+15)    /* (LONG) X position relative to right edge                    */
  46. #define PM_Bottom        (TAG_USER+16)    /* (LONG) Y position relative to bottom edge                    */
  47. #define PM_MinWidth        (TAG_USER+17)    /* (LONG) Minimum width                                */
  48. #define PM_MinHeight        (TAG_USER+18)    /* (LONG) Minimum height                            */
  49. #define PM_ForceFont        (TAG_USER+19)    /* (struct TextFont *tf) Use this font instead of user preferences.        */
  50. #define PM_PullDown        (TAG_USER+90)    /* (BOOL) Turn the menu into a pulldown menu.                    */
  51. #define PM_MenuHandler        (TAG_USER+91)    /* (struct Hook *) Hook that is called for each selected item, after the    */
  52.                         /* menu has been closed. This tag turns on MultiSelect.                */
  53. #define PM_AutoPullDown        (TAG_USER+92)    /* (BOOL) Automatic pulldown menu. (PM_FilterIMsg only)                */
  54. #define PM_LocaleHook        (TAG_USER+93)    /* (struct Hook *) Locale "GetString()" hook. (Not yet implemented)        */
  55. #define PM_CenterScreen        (TAG_USER+94)    /* (BOOL) Center menu on the screen                        */
  56. #define PM_UseLMB        (TAG_USER+95)    /* (BOOL) Left mouse button should be used to select an item            */
  57.                         /* (right button selects multiple items)                    */
  58. #define PM_DRIPensOnly        (TAG_USER+96)    /* (BOOL) Only use the screen's DRI pens, revert to system images if necessary.    */
  59.                         /* Use with care as it overrides the user's prefs!                */
  60. #define PM_HintBox        (TAG_USER+97)    /* (BOOL) Close the menu when the mouse is moved.                */
  61.  
  62. /*
  63. // Tags passed to MakeItem
  64. */
  65.  
  66. #define PM_Title        (TAG_USER+20)    /* (STRPTR) Item title                                */
  67. #define PM_UserData        (TAG_USER+21)    /* (void *) Anything, returned by OpenPopupMenu when this item is selected    */
  68. #define PM_ID            (TAG_USER+22)    /* (ULONG) ID number, if you want an easy way to access this item later        */
  69. #define PM_CommKey        (TAG_USER+47)    /* (char) Keyboard shortcut for this item.                    */
  70. #define PM_TitleID        (TAG_USER+49)    /* (ULONG) Locale string ID                             */
  71. #define PM_Object        (TAG_USER+43)    /* (Object *) BOOPSI object with the abillity to render this item        */
  72.  
  73. /* Submenu & Layout tags */
  74. /* PM_Sub & PM_Members are mutally exclusive */
  75. #define PM_Sub            (TAG_USER+23)    /* (PopupMenu *) Pointer to submenu list (from PM_MakeMenu)            */
  76. #define PM_Members        (TAG_USER+65)    /* (PopupMenu *) Members for this group (list created by PM_MakeMenu)        */
  77. #define PM_LayoutMode        (TAG_USER+64)    /* (ULONG) Layout method (PML_Horizontal / PML_Vertical)            */
  78.  
  79. /* Text attributes */
  80. #define PM_FillPen        (TAG_USER+26)    /* (BOOL) Make the item appear in FILLPEN                    */
  81. #define PM_Italic        (TAG_USER+29)    /* (BOOL) Italic text                                */
  82. #define PM_Bold            (TAG_USER+30)    /* (BOOL) Bold text                                */
  83. #define PM_Underlined        (TAG_USER+31)    /* (BOOL) Underlined text                            */
  84. #define PM_ShadowPen        (TAG_USER+34)    /* (BOOL) Draw text in SHADOWPEN                        */
  85. #define PM_ShinePen        (TAG_USER+35)    /* (BOOL) Draw text in SHINEPEN                            */
  86. #define PM_Center        (TAG_USER+36)    /* (BOOL) Center the text of this item                        */
  87. #define PM_TextPen        (TAG_USER+45)    /* (ULONG) Pen number for text colour of this item                */
  88. #define PM_Shadowed        (TAG_USER+48)    /* (BOOL) Draw a shadow behind the text                        */
  89.  
  90. /* Other item attributes */
  91. #define PM_TitleBar        (TAG_USER+32)    /* (BOOL) Horizontal separator bar                        */
  92. #define PM_WideTitleBar        (TAG_USER+33)    /* (BOOL) Same as above, but full width                        */
  93. #define PM_NoSelect        (TAG_USER+25)    /* (BOOL) Make the item unselectable (without visual indication)        */
  94. #define PM_Disabled        (TAG_USER+38)    /* (BOOL) Disable an item                            */
  95. #define PM_Hidden        (TAG_USER+63)    /* (BOOL) This item is not to be drawn (nor used in the layout process)        */
  96.  
  97. /* Images & Icons */
  98. #define PM_ImageSelected    (TAG_USER+39)    /* (struct Image *) Image when selected, title will be rendered on top it    */
  99. #define PM_ImageUnselected    (TAG_USER+40)    /* (struct Image *) Image when unselected                    */
  100. #define PM_IconSelected        (TAG_USER+41)    /* (struct Image *) Icon when selected                        */
  101. #define PM_IconUnselected    (TAG_USER+42)    /* (struct Image *) Icon when unselected                    */
  102.  
  103. /* Check/MX items */
  104. #define PM_Checkit        (TAG_USER+27)    /* (BOOL) Leave space for a checkmark                        */
  105. #define PM_Checked        (TAG_USER+28)    /* (BOOL) Make this item is checked                        */
  106. #define PM_AutoStore        (TAG_USER+44)    /* (BOOL *) Pointer to BOOL reflecting the current state of the item        */
  107. #define PM_Exclude        (TAG_USER+37)    /* (PM_IDLst *) Items to unselect or select when this gets selected        */
  108.  
  109. /* Dynamic construction/destruction */
  110. #define PM_SubConstruct        (TAG_USER+61)    /* (struct Hook *) Constructor hook for submenus. Called before menu is opened.    */
  111. #define PM_SubDestruct        (TAG_USER+62)    /* (struct Hook *) Destructor hook for submenus. Called after menu has closed.    */
  112.  
  113. /* Special/misc. stuff */
  114. #define PM_UserDataString    (TAG_USER+46)    /* (STRPTR) Allocates memory and copies the string to UserData.            */
  115. #define PM_Flags        (TAG_USER+24)    /* (UlONG) For internal use                            */
  116. #define PM_ColourBox        (TAG_USER+60)    /* (UlONG) Filled rectangle (for palettes etc.)                    */
  117.  
  118. /*
  119. // Tags passed to MakeMenu
  120. */
  121.  
  122. #define PM_Item            (TAG_USER+50)    /* (PopupMenu *) Item pointer from MakeItem                    */
  123. #define PM_Dummy        (TAG_USER+51)    /* (void) Ignored.                                */
  124.  
  125. /*
  126. // Tags passed to MakeIDList
  127. */
  128.  
  129. #define PM_ExcludeID        (TAG_USER+55)    /* (ULONG) ID number of menu to deselect when this gets selected        */
  130. #define PM_IncludeID        (TAG_USER+56)    /* (ULONG) ID number of menu to select when this gets selected            */
  131. #define PM_ReflectID        (TAG_USER+57)    /* (ULONG) ID number of menu that should reflect the state of this one        */
  132. #define PM_InverseID        (TAG_USER+58)    /* (ULONG) ID number of menu to inverse reflect the state of this one        */
  133.  
  134. /*
  135. // Tags for PM_InsertMenuItemA()
  136. */
  137.  
  138. #define PM_Insert_Before    (TAG_USER+200)    /* (BOOL) Insert before the item pointed to by the following argument    (N/A)    */
  139. #define PM_Insert_BeforeID    (TAG_USER+201)    /* (ULONG) Insert before the first item with ID equal to the argument        */
  140. #define PM_Insert_After        (TAG_USER+202)    /* (PopupMenu *) Insert after the item pointed to by the following argument    */
  141. #define PM_Insert_AfterID    (TAG_USER+203)    /* (ULONG) Insert after the first item with ID equal to the argument        */
  142. #define PM_Insert_Last        (TAG_USER+205)    /* (BOOL) Insert after the last item                        */
  143. #define PM_Insert_First        (TAG_USER+209)    /* (BOOL) Insert after the first item (which is usually invisible)        */
  144. #define PM_InsertSub_First    (TAG_USER+206)    /* (PopupMenu *) Insert before the first item in the submenu            */ 
  145. #define PM_InsertSub_Last    (TAG_USER+207)    /* (PopupMenu *) Insert at the and of a submenu                    */
  146. #define PM_InsertSub_Sorted    (TAG_USER+208)    /* (PopupMenu *)                             (N/A)    */
  147. #define PM_Insert_Item        (TAG_USER+210)    /* (PopupMenu *) Item to insert, may be repeated for several items        */
  148.  
  149. /*
  150. // Layout methods
  151. */
  152.  
  153. #define PML_None        0        /* Normal item        */
  154. #define PML_Horizontal        1        /* Horizontal group    */
  155. #define PML_Vertical        2        /* Vertical group    */
  156. #define PML_Table        3        /* Table group        */
  157. #define PML_Default        255        /* Don't use        */
  158.  
  159. /*
  160. // Macros
  161. */
  162.  
  163. #define PMMenu(t)    PM_MakeMenu(\
  164.             PM_Item, PM_MakeItem(PM_Hidden, TRUE, TAG_DONE),\
  165.             PM_Item, PM_MakeItem(PM_Title, t, PM_NoSelect, TRUE, PM_ShinePen, TRUE, PM_Shadowed, TRUE, PM_Center, TRUE, TAG_DONE),\
  166.             PM_Item, PM_MakeItem(PM_WideTitleBar, TRUE, TAG_DONE)
  167. #define PMMenuID(t)    PM_MakeMenu(\
  168.             PM_Item, PM_MakeItem(PM_Hidden, TRUE, TAG_DONE),\
  169.             PM_Item, PM_MakeItem(PM_TitleID, t, PM_NoSelect, TRUE, PM_ShinePen, TRUE, PM_Shadowed, TRUE, PM_Center, TRUE, TAG_DONE),\
  170.             PM_Item, PM_MakeItem(PM_WideTitleBar, TRUE, TAG_DONE)
  171. #define PMSubMenu(t)    PM_Sub, PM_MakeMenu(PM_Item, PM_MakeItem(PM_Title, t, PM_NoSelect, TRUE, PM_ShinePen, TRUE, TAG_DONE),\
  172.             PM_Item, PM_MakeItem(PM_WideTitleBar, TRUE, TAG_DONE)
  173. #define PMSimpleSub    PM_Sub, PM_MakeMenu(PM_Dummy, 0
  174. #define PMItem(t)    PM_Item, PM_MakeItem(PM_Title, t
  175. #define PMItemID(t)    PM_Item, PM_MakeItem(PM_TitleID, t
  176. #define PMInfo(t)    PM_Item, PM_MakeItem(PM_Title, t, PM_NoSelect, TRUE, PM_ShinePen, TRUE
  177. #define PMColBox(c)    PM_Item, PM_MakeItem(PM_ColourBox, c
  178. #define PMBar        PM_Item, PM_MakeItem(PM_TitleBar, TRUE
  179. #define PMMenuTitle(t)    PM_Item, PM_MakeItem(PM_Title, t, PM_NoSelect, TRUE, PM_ShinePen, TRUE, PM_Shadowed, TRUE, PM_Center, TRUE, TAG_DONE),\
  180.             PM_Item, PM_MakeItem(PM_WideTitleBar, TRUE, TAG_DONE)
  181. #define PMHoriz        PM_Item, PM_MakeItem(PM_NoSelect, TRUE, PM_LayoutMode, PML_Horizontal
  182. #define PMVert        PM_Item, PM_MakeItem(PM_NoSelect, TRUE, PM_LayoutMode, PML_Vertical
  183. #define PMMembers    PM_Members, PM_MakeMenu(PM_Dummy, 0
  184.  
  185. #define PMExcl        PM_Exclude, PM_MakeIDList(
  186. #define ExID(id)    PM_ExcludeID, id
  187. #define InID(id)    PM_IncludeID, id
  188. #define RefID(id)    PM_ReflectID, id
  189. #define InvID(id)    PM_InverseID, id
  190.  
  191. #define PMCheckItem(t,id)    PM_Item, PM_MakeItem(PM_Title, t, PM_ID, id, PM_Checkit, TRUE
  192.  
  193. #define PMEnd        TAG_DONE)
  194.  
  195. #ifndef End
  196. #define End        TAG_DONE)
  197. #endif
  198.  
  199. #define PMERR        (-5L)
  200.  
  201. /* For compatibility with old sources - DO NOT USE */
  202. #define PMTitleBar    PMBar
  203. #define PMNarrowBar    PMBar
  204. #define PMNarrowTitleBar PMBar
  205.  
  206. /*
  207. // Library base
  208. */
  209.  
  210. #ifndef PM_NOBASE
  211.  
  212. struct PopupMenuBase {
  213.     struct Library        pmb_Library;
  214.     ULONG            pmb_SegList;
  215.     ULONG            pmb_Flags;
  216.     struct Library        *pmb_ExecBase;        /* Theese library */
  217.     struct Library        *pmb_UtilityBase;    /* pointers are   */
  218.     struct Library        *pmb_IntuitionBase;    /* valid as long  */
  219.     struct Library        *pmb_GfxBase;        /* as pm lib      */
  220.     struct Library        *pmb_DOSBase;        /* is open.       */
  221.     BOOL            pmb_NewPrefs;        /* Reload prefs.  */
  222.     struct Library        *pmb_CxBase;        /* commodities.   */
  223. };
  224.  
  225. #endif
  226.  
  227. #define POPUPMENU_VERSION    9L
  228. #define POPUPMENU_NAME        "popupmenu.library"
  229. #define OPEN_PM_LIB        (PopupMenuBase=(struct PopupMenuBase *)\
  230.                 OpenLibrary(POPUPMENU_NAME, POPUPMENU_VERSION))
  231. #define CLOSE_PM_LIB        if(PopupMenuBase) CloseLibrary((struct Library *)PopupMenuBase);
  232.  
  233. /*
  234. // PopupMenu structure
  235. //
  236. // WARNING!
  237. // This structure may change in future versions.
  238. */
  239.  
  240. #ifndef PMPRIV_H
  241.  
  242. struct PopupMenu {    /* Size: 0x1E - 0x3C */
  243.     struct PopupMenu    *Next;        /* 0  Next menu in the list, NULL terminated    */
  244.     struct PopupMenu    *Sub;        /* 4  SubMenu or Group                */
  245.     union {
  246.         STRPTR        Title;        /* 8  Title                    */
  247.         ULONG        TitleID;    /* 8  Locale string ID                */
  248.         Object        *Boopsi;    /* 8  Boopsi object                */
  249.     };
  250.     ULONG            Flags;        /* C  Private flags                */
  251.     ULONG            ID;        /* 10 Item ID                    */
  252.     APTR            UserData;    /* 14 UserData                    */
  253.     WORD            Left;        /* 18 Left pos of this item, private!        */
  254.     WORD            Top;        /* 1A Top pos of this item, private!        */
  255.     UWORD            Width;        /* 1C Width of this item, private!        */
  256.     UWORD            Height;        /* 1E Height of this item, private!        */
  257.  
  258.     /* NOTE:                            */
  259.     /* The fields below exist only when they are required !        */  
  260.  
  261.     UWORD            ExtFlags;
  262.     UBYTE            Layout;
  263.     UBYTE            ColBox;
  264.     struct PM_IDLst        *Exclude;    /* 20 Exclude/Included/Reflected items        */
  265.     BOOL            *AutoSetPtr;    /* 24 Ptr to BOOL containing current state    */
  266.     struct Image        *Images[2];    /* 28 Images/Icons (0 - unselected, 1 - sel    */
  267.     UBYTE            Masks[2];    /* 1C Image/Icon blit masks            */
  268.     UBYTE            CommKey;    /* 1E Command Key                */
  269.     UBYTE            Weight;        /* 1F Weight                    */
  270.     ULONG            TextPen;    /* 20 Pen number for item's text        */
  271.     struct Hook        *SubConstruct;    /* 24 SubMenu Constructor hook            */
  272.     struct Hook        *SubDestruct;    /* 28 SubMenu Destructor hook            */
  273. };
  274.  
  275. #endif
  276.  
  277. #endif
  278.